home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 722 / 722.xpi / chrome / noscript.jar / content / noscript / DOM.js < prev    next >
Text File  |  2010-02-12  |  7KB  |  242 lines

  1. const DOM = {
  2.   
  3.   confirm: function(s) {  // for interactive debugging purposes
  4.     return this.mostRecentBrowserWindow.confirm(s);
  5.   },
  6.   
  7.   consoleDump: false,
  8.   dump: function(msg) {
  9.     if(this.consoleDump) dump("[NoScript DOM] " + msg + "\n");
  10.   },
  11.   
  12.   findBrowser: function(chrome, win) {
  13.     
  14.     var overlay = chrome.noscriptOverlay;
  15.     if (!overlay) return null;
  16.     
  17.     var browser = overlay.currentBrowser;
  18.     if (browser.contentWindow == win) return browser;
  19.     
  20.     var browsers = overlay.browsers;
  21.     if (!browsers) return null;
  22.     
  23.     for (var j = browsers.length; j-- > 0;) {
  24.       browser = browsers[j];
  25.       if (browser.contentWindow == win) return browser;
  26.     }
  27.     
  28.     return null;
  29.   },
  30.   
  31.   findBrowserForNode: function(ctx) {
  32.     if (!ctx) return null;
  33.     var bi = null;
  34.     try {
  35.       if (!(ctx instanceof CI.nsIDOMWindow)) {
  36.         if (ctx instanceof CI.nsIDOMDocument) {
  37.           ctx = ctx.defaultView;
  38.         } else if(ctx instanceof CI.nsIDOMNode) {
  39.           ctx = ctx.ownerDocument.defaultView;
  40.         } else return null; 
  41.       }
  42.       if (!ctx) return null;
  43.       try {
  44.         ctx = CU.lookupMethod(ctx, "top")();
  45.       } catch(e) {
  46.         ctx = ctx.top;
  47.       }
  48.       var bi = this.createBrowserIterator(this.getChromeWindow(ctx));
  49.       
  50.       for (var b; b = bi.next();) {
  51.         try {
  52.           if (b.contentWindow == ctx) return b;
  53.         } catch(e1) {
  54.           this.dump("Skipping browser iteration: " + e1);
  55.         }
  56.       }
  57.       this.dump("Browser not found for " + ctx);
  58.     } catch(e2) {
  59.       this.dump("Can't find browser for " + ctx + ": " + e2);
  60.     } finally {
  61.       if (bi) bi.dispose();
  62.       ctx = null;
  63.     }
  64.    
  65.     return null;
  66.   },
  67.   
  68.   getDocShellForWindow: function(window) {
  69.     try {
  70.       return window.QueryInterface(CI.nsIInterfaceRequestor)
  71.                    .getInterface(CI.nsIWebNavigation)
  72.                    .QueryInterface(CI.nsIDocShell);
  73.     } catch(e) {
  74.       return null;
  75.     }
  76.   },
  77.     
  78.   getChromeWindow: function(window) {
  79.     try {
  80.       return this.getDocShellForWindow(window)
  81.         .QueryInterface(CI.nsIDocShellTreeItem).rootTreeItem
  82.         .QueryInterface(CI.nsIInterfaceRequestor)
  83.         .getInterface(CI.nsIDOMWindow).window;
  84.     } catch(e) {
  85.       return null;
  86.     }
  87.   },
  88.   
  89.   get windowMediator() {
  90.     delete this.windowMediator;
  91.     return this.windowMediator = CC['@mozilla.org/appshell/window-mediator;1']
  92.                   .getService(CI.nsIWindowMediator);
  93.   },
  94.   
  95.   _winType: null,
  96.   perWinType: function(delegate) {
  97.     var wm = this.windowMediator;
  98.     var w = null;
  99.     var aa = Array.prototype.slice.call(arguments);
  100.     for each(var type in ['navigator:browser', 'emusic:window', 'Songbird:Main']) {
  101.      aa[0] = type;
  102.       w = delegate.apply(wm, aa);
  103.       if (w) {
  104.         this._winType = type;
  105.         break;
  106.       }
  107.     }
  108.     return w;
  109.   },
  110.   get mostRecentBrowserWindow() {
  111.     var res = this._winType && this.windowMediator.getMostRecentWindow(this._winType, true);
  112.     return res || this.perWinType(this.windowMediator.getMostRecentWindow, true);
  113.   },
  114.   
  115.   get windowEnumerator() {
  116.     var res = this._winType && this.windowMediator.getZOrderDOMWindowEnumerator(this._winType, true);
  117.     return res || this.perWinType(this.windowMediator.getZOrderDOMWindowEnumerator, true);
  118.   },
  119.   createBrowserIterator: function(initialWin) {
  120.     return new BrowserIterator(initialWin);
  121.   },
  122.   
  123.   addClass: function(e, c) {
  124.     var cur = e.className;
  125.     if (cur) {
  126.       var cc = cur.split(/\s+/);
  127.       if (cc.indexOf(c) > -1) return;
  128.       cc.push(c);
  129.       e.className = cc.join(" ");
  130.     } else e.className += " " + c;
  131.   },
  132.   removeClass: function(e, c) {
  133.     var cur = e.className;
  134.     if (cur) {
  135.       var cc = cur.split(/\s+/);
  136.       for (var pos; (pos = cc.indexOf(c)) > -1;)
  137.         cc.splice(pos, 1);
  138.       
  139.       e.className = cc.join(" ");
  140.     }
  141.   },
  142.   hasClass: function(e, c) {
  143.     var cur = e.className;
  144.     return cur && cur.split(/\s+/).indexOf(c) > -1;
  145.   },
  146.   
  147.   _idCounter: Math.round(Math.random() * 9999),
  148.   rndId: function() {
  149.     return Date.now().toString(32) + "_" + (this._idCounter++).toString(32) + "_" + Math.round(Math.random() * 9999999).toString(32);
  150.   },
  151.   
  152.   elementContainsPoint: function(el, p) {
  153.     var rect = this.computeRect(el);
  154.     return p.x >= rect.left && p.x <= rect.right && p.y >= rect.top && p.y <= rect.bottom;
  155.   },
  156.   
  157.   computeRect: function(el) {
  158.     if ("getBoundingClientRect" in el) {
  159.       return el.getBoundingClientRect();
  160.     }
  161.     // legacy pre 1.9
  162.     var box = el.ownerDocument.getBoxObject(el);
  163.     var rect = { top: box.y, left: box.x };
  164.     rect.bottom = rect.top + box.height;
  165.     rect.right = rect.left + box.width;
  166.     return rect;
  167.   }
  168.   
  169. };
  170.  
  171. function BrowserIterator(initialWin) {
  172.   if (!initialWin) {
  173.     initialWin = DOM.mostRecentBrowserWindow;
  174.   }
  175.   this.currentWin = this.initialWin = initialWin;
  176.   this.initPerWin();
  177. }
  178. BrowserIterator.prototype = {
  179.  
  180.   initPerWin: function() {
  181.     var overlay = this.currentWin && (this.currentWin.wrappedJSObject || this.currentWin).noscriptOverlay;
  182.     if (overlay) {
  183.       this.browsers = overlay.browsers;
  184.       this.currentTab = overlay.currentBrowser;
  185.     } else  {
  186.       this.currentTab = this.currentWin = null;
  187.       this.browsers = [];
  188.     }
  189.     this.mostRecentTab = this.currentTab;
  190.     this.curTabIdx = 0;
  191.   },
  192.   
  193.   next: function() {
  194.     var ret = this.currentTab;
  195.     this.currentTab = null;
  196.     if(ret != null) return ret.wrappedJSObject || ret;
  197.     if(!this.initialWin) return null;
  198.     if (this.curTabIdx >= this.browsers.length) {
  199.       if (!this.winEnum) {
  200.         this.winEnum = DOM.windowEnumerator;
  201.       }
  202.       if (this.winEnum.hasMoreElements()) {
  203.         this.currentWin = this.winEnum.getNext();
  204.         if (this.currentWin != this.initialWin){
  205.            this.initPerWin();
  206.         }
  207.         return this.next();
  208.       } else {
  209.         this.dispose();
  210.         return null;
  211.       }
  212.     }
  213.     this.currentTab = this.browsers[this.curTabIdx++];
  214.     if (this.currentTab == this.mostRecentTab) this.next();
  215.     return this.next();
  216.   },
  217.   dispose: function() {
  218.     if (!this.initialWin) return; // already disposed;
  219.     this.initialWin = 
  220.       this.currentWin = 
  221.       this.browsers = 
  222.       this.currentTab = 
  223.       this.mostRecentTab = 
  224.       this.winEnum = 
  225.       null;
  226.   },
  227.   
  228.   find: function(filter) {
  229.     try {
  230.       for (var b; b = this.next();) {
  231.         if (filter(b)) {
  232.           return b;
  233.         }
  234.       }
  235.     } finally {
  236.       this.dispose();
  237.       filter = null;
  238.     }
  239.     return null;
  240.   }
  241. };
  242.